﻿/**
 * @file Types.h
 * @brief SSD仿真系统NAND相关类型定义。
 *
 * 本文件采用模板类型封装各NAND地址分量，
 * 目的是为每个分量提供类型安全和语义区分，
 * 防止不同分量间误用和提升代码可读性。
 * 例如 tChannel、tDeviceInChannel 等均为不同的类型，
 * 即使底层都是U8/U16，也不会被误用或混淆。
 *
 * @section PrimitiveTemplate_Explain PrimitiveTemplate用法说明
 * PrimitiveTemplate 是一个模板结构体，定义如下：
 * @code
 * template<class T, class N>
 * struct PrimitiveTemplate {
 *     T _;
 *     // 支持隐式转换、赋值、自增、自加等操作
 * };
 * @endcode
 *
 * 用法和作用：
 * - 类型安全：通过第二个模板参数 N（通常是一个空 struct），即使底层类型相同，不同分量也不会混用，编译器会强类型检查。
 * - 语义区分：每个 NAND 地址分量都用不同类型表达，代码更易读、更易维护。
 * - 运算符重载：支持自增、自加、赋值等操作，使用体验与原生类型类似。
 * - 底层封装：实际值存储在成员变量 _ 中，支持隐式转换为原生类型。
 *
 * 示例：
 * @code
 * using tChannel = PrimitiveTemplate<U8, struct Channel>;
 * using tDeviceInChannel = PrimitiveTemplate<U8, struct DeviceInChannel>;
 * // 虽然底层都是U8，但不能混用，编译器会强类型检查。
 * @endcode
 */
#ifndef __Types_h__
#define __Types_h__

#include "BasicTypes.h"

/**
 * @typedef tChannel
 * @brief NAND通道类型，封装为模板以保证类型安全。
 */
using tChannel = PrimitiveTemplate<U8, struct Channel>;
/**
 * @typedef tDeviceInChannel
 * @brief NAND通道内设备类型，封装为模板以保证类型安全。
 */
using tDeviceInChannel = PrimitiveTemplate<U8, struct DeviceInChannel>;
/**
 * @typedef tBlockInDevice
 * @brief 设备内块类型，封装为模板以保证类型安全。
 */
using tBlockInDevice = PrimitiveTemplate<U16, struct BlockInDevice>;
/**
 * @typedef tPageInBlock
 * @brief 块内页类型，封装为模板以保证类型安全。
 */
using tPageInBlock = PrimitiveTemplate<U16, struct PageInBlock>;
/**
 * @typedef tSectorInPage
 * @brief 页内扇区类型，封装为模板以保证类型安全。
 */
using tSectorInPage = PrimitiveTemplate<U8, struct SectorInPage>;

#endif